// 包声明：表示这个类属于com.itheima.method包
package com.itheima.method;

// 公共类声明：定义了一个名为MethodDemo2的公共类，用于演示方法重载
public class MethodDemo2 {
    // main方法：程序的入口点
    public static void main(String[] args) {
        // 目标：认识方法重载。
        // 注意：这个main方法是空的，文件中的方法主要用于演示概念，没有实际调用
    }

    // 定义一个方法，打印一个整数
    // 方法名：print
    // 参数：一个整数类型的参数a
    // 这个方法用于打印整数
    public static void print(int a) {
        // 打印传入的整数参数a的值
        System.out.println(a);
    }

    // 定义一个重载的方法
    // 这是一个方法重载的例子：方法名相同，但参数类型不同
    // 参数类型从int改为了String，表示这个方法用于打印字符串
    public static void print(String str) {
        // 打印传入的字符串参数str的值
        System.out.println(str);
    }

    // 定义一个重载的方法
    // 这是另一个方法重载的例子：方法名相同，但参数个数不同（从1个参数变为2个参数）
    // 参数类型分别为double和int，表示这个方法用于打印浮点数和整数
    public static void print(double d, int a) {
        // 打印传入的第一个参数d（double类型）的值
        System.out.println(d);
    }

    // 定义另一个重载的方法
    // 这是方法重载的第三个例子：方法名相同，参数个数相同，但参数顺序不同
    // 参数顺序从(double d, int a)改为了(int a, double d)
    public static void print(int a, double d) {
        // 打印传入的第二个参数d（double类型）的值
        System.out.println(d);
    }

    // 重复的方法，冲突了！
    // 这段代码被注释掉了，因为它与上面的print(int a, double d)方法冲突
    // 虽然参数名称不同（a1 vs a, d1 vs d），但参数类型和顺序完全相同
    // 方法重载不关心参数名称，只关心参数类型和顺序
//    public static void print(int a1, double d1) {
//        System.out.println(d1);
//    }

    // 注意：方法重载只关心方法名称相同，形参列表不同（类型不同，个数不同, 顺序不同），其他都无所谓
    // 方法重载的规则总结：
    // 1. 方法名必须相同
    // 2. 参数列表必须不同（参数类型不同、参数个数不同或参数顺序不同）
    // 3. 方法重载与返回值类型、访问修饰符无关

    // 需求：发射导弹
    // 定义一个发射导弹的方法，接受两个整数坐标参数
    public static void fire(int x, int y) {
        // 打印发射导弹的信息，包括坐标x和y
        System.out.println("发射导弹，坐标：" + x + "," + y);
    }

    // 定义一个重载方法
    // 这是fire方法的重载版本：参数个数不同（2个变为3个），部分参数类型也不同（int变为double）
    // 多了一个String类型的location参数
    public static void fire(double x, double y, String location) {
        // 打印发射导弹的信息，包括坐标x和y
        System.out.println("发射导弹，坐标：" + x + "," + y);
    }
}
